import { Channel ,Articles} from "@/types/data";
// 引入 Channel 类型定义

import { HomeAction } from "@/types/store";
// 引入 HomeAction 类型定义

import { sortBy } from "lodash";
// 引入 lodash 中的 sortBy 函数，用于排序

// 定义 HomeState 类型
type HomeState = {
  userChannel: Channel[]; // 用户频道数组
  channelActiveKey: string; // 当前活跃的频道键值
  AllChannel: Channel[]; // 所有频道数组
  channelArticles: {
    [key: number]: Articles;
  };
};

// 初始化状态
const initialState: HomeState = {
  userChannel: [], // 用户频道初始为空数组
  channelActiveKey: "", // 当前活跃的频道键值初始为空字符串
  AllChannel: [], // 所有频道初始为空数组
  channelArticles: {},
};

// 定义 Home reducer
const Home = (state = initialState, action: HomeAction): HomeState => {
  switch (action.type) {
    case "home/getUserChannel":
      // 获取用户频道 action
      return {
        ...state,
        userChannel: action.payload, // 更新用户频道数组
        channelActiveKey: action.payload[0]?.id + "", // 更新当前活跃的频道键值
      };
    case "home/changeTab":
      // 改变当前活跃频道 action
      return {
        ...state,
        channelActiveKey: action.payload, // 更新当前活跃的频道键值
      };
    case "home/getAllChannel":
      // 获取所有频道 action
      return {
        ...state,
        AllChannel: action.payload, // 更新所有频道数组
      };
    case "home/delChannel":
      // 删除频道 action
      return {
        ...state,
        // 删除当前频道
        userChannel: state.userChannel.filter(
          (item) => item.id !== action.payload.id
        ),
        // 将被删除频道添加到推荐频道中，并且根据 id 进行排序
        AllChannel: sortBy([...state.AllChannel, action.payload], "id"),
      };
    case "home/addChannel":
      // 添加频道 action
      return {
        ...state,
        userChannel: [...state.userChannel, action.payload], // 将新添加的频道添加到用户频道数组中
        AllChannel: state.AllChannel.filter(
          (item) => item.id !== action.payload.id
        ), // 从所有频道数组中过滤掉新添加的频道
      };
      case 'home/getChannelArticles':
      // 注意：当前频道的文章列表数据可能为空（比如，第一次加载），为了方便后续操作
      //      此处为其指定默认值
      const curChannelArticles = state.channelArticles[
        action.payload.channelId
      ] ?? {
        pre_timestamp: null,
        results: [],
      };
      const {
        channelId,
        data: { pre_timestamp, results },
      } = action.payload;

      return {
        ...state,
        channelArticles: {
          ...state.channelArticles,
          // 修改当前频道对应的文章列表数据
          [channelId]: {
            pre_timestamp,
            // 追加文章列表数据
            results: [...curChannelArticles.results, ...results],
          },
        },
      };
    default:
      return state;
  }
};

export default Home;
